

#include "QLogger.h"
#include <QtCore/QtDebug>

QLogger QLogger::msInstance;
	
	
QLogger &QLogger::instance()
{
	return msInstance;
}
	

QLogger::QLogger()
    : mFile(0)
{
}

QLogger::~QLogger()
{
    if (mFile != 0)
    {
        mFile->close();
        delete mFile;
        mFile = 0;
    }
}

bool QLogger::init(const QString &fileName, bool forceOutput/* = false */, bool async/* = false*/)
{
    if (fileName.isEmpty())
        return false;
    
    mForceOutput = forceOutput;
    mAsyncMode = async;
    
    if (mForceOutput)
    {
        mFile = new QFile(fileName);
        if (0 == mFile)
            return false;
        
        if (!mFile->open(QIODevice::ReadWrite|QIODevice::Text|QIODevice::Truncate))
            return false;
    }
    else
    {
#ifdef QT_DEBUG
        mFile = new QFile(fileName);
        if (0 == mFile)
            return false;
        
        if (!mFile->open(QIODevice::ReadWrite|QIODevice::Text|QIODevice::Truncate))
            return false;
#endif
    }
    
    return true;
}

void QLogger::write(QLogLevel level, const char *file, int line, const QString &msg)
{
    if (mForceOutput)
    {
        output((QtMsgType)level, file, line, msg);
    }
    else
    {
#ifdef QT_DEBUG
        output((QtMsgType)level, file, line, msg);
#endif
    }
}

void QLogger::write(QLogLevel level, const char *file, int line, const char *fmt, ...)
{
    if (mForceOutput)
    {
        char msg[4096];
		memset(msg, 0, sizeof(msg));
        
		va_list vl;
		va_start(vl, fmt);
		vsnprintf(msg, 4096, fmt, vl);
		va_end(vl);
        
        output((QtMsgType)level, file, line, msg);
    }
    else
    {
#ifdef QT_DEBUG
        char msg[4096];
		memset(msg, 0, sizeof(msg));
        
		va_list vl;
		va_start(vl, fmt);
		vsnprintf(msg, 4096, fmt, vl);
		va_end(vl);
        
        output((QtMsgType)level, file, line, msg);
#endif
    }
}

void QLogger::output(QtMsgType type, const char *file, int line, const QString &msg)
{
    QString text;
    
	QDateTime dateTime = QDateTime::currentDateTime();
	QString date = dateTime.toString("yyyy-MM-dd hh:mm:ss:zzz");

    switch (type)
    {
    case QtDebugMsg:
        {
            text = QString("[Debug %1:%2] %3 ----- %4").arg(file).arg(line).arg(date).arg(msg);
        }
        break;
    case QtWarningMsg:
        {           
            text = QString("[Warning %1:%2] %3 ----- %4").arg(file).arg(line).arg(date).arg(msg);
        }
        break;
    case QtCriticalMsg:
        {
            text = QString("[Critical %1:%2] %3 ----- %4").arg(file).arg(line).arg(date).arg(msg);
        }
        break;
    case QtFatalMsg:
        {
            text = QString("[Fatal %1:%2] %3 ----- %4").arg(file).arg(line).arg(date).arg(msg);
        }
        break;
    default:
        {
            text = QString("[Fatal %1:%2] %3 ----- %4").arg(file).arg(line).arg(date).arg(msg);
        }
        break;
    }
    
    mMutex.lock();
    
    QDebug fs(mFile);
    fs<<text<<endl;
    
    QDebug console(type);
    console<<text;
    
    mMutex.unlock();
}

